`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2020/09/15 09:57:20
// Design Name: 
// Module Name: RegRead
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module RegRead(
    input   wire        clk,
    input   wire        rst,

    input   wire [4:0]  i_rs,
    input   wire [4:0]  i_rt,
    input   wire [4:0]  i_rd,
    input   wire        i_we,
    input   wire [31:0] i_wr_data,
    
    input   wire [4:0]  i_side_addr_1,
    input   wire [4:0]  i_side_addr_2,
    input   wire [31:0] i_side_data_1,
    input   wire [31:0] i_side_data_2,
    input   wire        i_side_en_1,
    input   wire        i_side_en_2,
    
    output  wire [31:0] o_rs_out,
    output  wire [31:0] o_rt_out
    );
    
    wire [31:0] t_rs_out;
    wire [31:0] t_rt_out;
    
    Regfile regfile(
        .clk(clk),
        .rst(rst),
        .i_rs(i_rs),
        .i_rt(i_rt),
        .i_rd(i_rd),
        .i_we(i_we),
        .i_wr_data(i_wr_data),
        
        .o_rs_out(t_rs_out),
        .o_rt_out(t_rt_out)
    );
    
    assign o_rs_out
        = i_side_en_1 && i_side_addr_1 == i_rs ? i_side_data_1
        : i_side_en_2 && i_side_addr_2 == i_rs ? i_side_data_2
        : t_rs_out
    ;
    
    assign o_rt_out
        = i_side_en_1 && i_side_addr_1 == i_rt ? i_side_data_1
        : i_side_en_2 && i_side_addr_2 == i_rt ? i_side_data_2
        : t_rt_out
    ;
    
endmodule
